/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.model;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.db.SqlManager;
import com.exception.DataException;
import com.javabeans.Ciudad;
import com.javabeans.Provincia;

/**
 * @author  Administrador
 */

public class AdminProvincia implements ProvinciaManager{
    private Connection c;

    public AdminProvincia(Connection c){
        this.c = c;
    }
    
    public int getIdProvincia(int idPais, int idCiudad) throws DataException {
        int res = 0;
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "SELECT IFNULL(max(IDPROVINCIA)+1,1) AS ID FROM PROVINCIA WHERE IDPAIS="+idPais+" AND IDCIUDAD = "+idCiudad;
        try{
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            rs.next();
            res = rs.getInt("ID");
        }catch(SQLException e){
            throw new DataException(" AdminProvincia -> getIdProvincia() "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return res;
    }

    public void saveProvincia(Provincia p) throws DataException {
        PreparedStatement preSt = null;
        try{
            String query ="INSERT INTO PROVINCIA VALUES("+p.getIdPais();
            query += ", "+p.getIdCiudad();
            query += ", "+p.getIdProvincia();
            query += ", '"+p.getNombre().toUpperCase().trim();
            query += "', '"+p.getSigla().toUpperCase().trim();
            query += "', "+p.isActivo()+")";             
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
            
        }catch(SQLException ex){
            throw new DataException(" AdminProvincia -> saveProvincia(Provincia p) "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    
    @Override
    public List<Provincia> getProvinciasActivos() throws DataException {
        List<Provincia> provincias = new ArrayList<Provincia>();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        try{
            String query = "SELECT IDPAIS, IDCIUDAD, IDPROVINCIA, NOMBRE, SIGLA";
            query += " FROM PROVINCIA";
            query += " WHERE ACTIVO=1";
            query += " ORDER BY NOMBRE";             
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                Provincia p = new Provincia();
                p.setIdPais(rs.getInt("IDPAIS"));
                p.setIdCiudad(rs.getInt("IDCIUDAD"));
                p.setIdProvincia(rs.getInt("IDPROVINCIA"));
                p.setNombre(rs.getString("NOMBRE"));
                p.setSigla(rs.getString("SIGLA"));
                p.setActivo(true);
                provincias.add(p);
            }
        }catch(SQLException e){
            throw new DataException(" AdminProvincia -> getProvinciasActivos() e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return provincias;
    }
    
    public List<Provincia> getProvinciasPorPais(int idPais) throws DataException{
        List<Provincia> provincias = new ArrayList<Provincia>();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        try{
            String query = "SELECT P.IDPAIS, P.IDCIUDAD, P.IDPROVINCIA, P.NOMBRE, P.SIGLA";
            query += ", C.NOMBRE, C.SIGLA";
            query += " FROM PROVINCIA P";
            query += " INNER JOIN CIUDAD C ON P.IDPAIS=C.IDPAIS AND P.IDCIUDAD=C.IDCIUDAD";
            query += " WHERE P.IDPAIS = "+idPais+" AND P.ACTIVO=1";
            query += " ORDER BY C.NOMBRE, P.NOMBRE";             
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                Provincia p = new Provincia();
                p.setIdPais(rs.getInt("P.IDPAIS"));
                p.setIdCiudad(rs.getInt("P.IDCIUDAD"));
                p.setIdProvincia(rs.getInt("P.IDPROVINCIA"));
                p.setNombre(rs.getString("P.NOMBRE"));
                p.setSigla(rs.getString("P.SIGLA"));
                
                Ciudad ci = new Ciudad();
                ci.setNombre(rs.getString("C.NOMBRE"));
                ci.setSigla(rs.getString("SIGLA"));
                p.setCiudad(ci);
                provincias.add(p);
            }
        }catch(SQLException e){
            throw new DataException(" AdminProvincia -> getProvinciasPorPais(int idPais) e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return provincias;
    }
    
    public List<Provincia> getProvinciasPorPaisInactivos(int idPais) throws DataException{
        List<Provincia> provincias = new ArrayList<Provincia>();
        ResultSet rs = null;
        PreparedStatement preSt = null;
        try{
            String query = "SELECT P.IDPAIS, P.IDCIUDAD, P.IDPROVINCIA, P.NOMBRE, P.SIGLA";
            query += ", C.NOMBRE, C.SIGLA";
            query += " FROM PROVINCIA P";
            query += " INNER JOIN CIUDAD C ON P.IDPAIS=C.IDPAIS AND P.IDCIUDAD=C.IDCIUDAD";
            query += " WHERE P.IDPAIS = "+idPais+" AND P.ACTIVO=0";
            query += " ORDER BY C.NOMBRE, P.NOMBRE";             
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            while(rs.next()){
                Provincia p = new Provincia();
                p.setIdPais(rs.getInt("P.IDPAIS"));
                p.setIdCiudad(rs.getInt("P.IDCIUDAD"));
                p.setIdProvincia(rs.getInt("P.IDPROVINCIA"));
                p.setNombre(rs.getString("P.NOMBRE"));
                p.setSigla(rs.getString("P.SIGLA"));
                
                Ciudad ci = new Ciudad();
                ci.setNombre(rs.getString("C.NOMBRE"));
                ci.setSigla(rs.getString("C.SIGLA"));
                p.setCiudad(ci);
                provincias.add(p);
            }
        }catch(SQLException e){
            throw new DataException(" AdminProvincia -> getProvinciasPorPaisInactivos(int idPais) e = "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return provincias;
    }
    
    public void updateProvincia(Provincia pr)throws DataException {
        PreparedStatement preSt = null;
        try{
            String query = "UPDATE PROVINCIA SET NOMBRE ='"+pr.getNombre().toUpperCase();
            query+= "', SIGLA ='"+pr.getSigla().toUpperCase();
            query+= "' WHERE IDPAIS = "+pr.getIdPais()+" AND IDCIUDAD = "+pr.getIdCiudad()+" AND IDPROVINCIA = "+pr.getIdProvincia();
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" AdminProvincia -> updateProvincias(Provincia pr) e = "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    
    public boolean isUseInDetalleEst(int idPais, int idCiudad, int idProvincia) throws DataException{
        boolean res = false;
        ResultSet rs = null;
        PreparedStatement preSt = null;
        String query = "SELECT IDDETALLE_ESTUDIANTE";
        query += " FROM DETALLE_ESTUDIANTE";
        query += " WHERE (IDPAIS_ACTUAL = "+idPais+" AND IDCIUDAD_ACTUAL="+idCiudad+" AND IDPROVINCIA_ACTUAL = "+idProvincia;
        query += ") OR (IDPAIS_NAC = "+idPais+" AND IDCIUDAD_NAC = "+idCiudad+" AND IDPROVINCIA_NAC = "+idProvincia;
        query += ") LIMIT 1";
        try{
            preSt = c.prepareStatement(query);
            rs = preSt.executeQuery();
            if(rs.next())
                res = true;
        }catch(SQLException e){
            throw new DataException(" AdminProvincia -> isUseInDetalleEst() "+e.getMessage());
        }finally{
            SqlManager.closeRs(rs);
            SqlManager.closePreSt(preSt);
        }
        return res;
    }
    
    public void deleteProvincia(int idPais, int idCiudad, int idProvincia) throws DataException {
        PreparedStatement preSt = null;
        String query = "DELETE FROM PROVINCIA WHERE IDPAIS="+idPais+" AND IDCIUDAD="+idCiudad+" AND IDPROVINCIA="+idProvincia;
        try{
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException e){
            throw new DataException(" AdminProvincia -> deleteProvincia(int idPais, int idCiudad, int idProvincia) e = "+e.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    
    public void darBaja(int idPais, int idCiudad, int idProvincia)throws DataException{
        PreparedStatement preSt = null;
        try{
            String query = "UPDATE PROVINCIA SET ACTIVO = 0 WHERE IDPAIS="+idPais+" AND IDCIUDAD="+idCiudad+" AND IDPROVINCIA = "+idProvincia;
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" AdminProvincia -> darBaja(int idPais, int idCiudad, int idProvincia) e = "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }
    
    public void darAlta(int idPais, int idCiudad, int idProvincia)throws DataException{
        PreparedStatement preSt = null;
        try{
            String query = "UPDATE PROVINCIA SET ACTIVO = 1 WHERE IDPAIS="+idPais+" AND IDCIUDAD="+idCiudad+" AND IDPROVINCIA="+idProvincia;
            preSt = c.prepareStatement(query);
            preSt.executeUpdate();
        }catch(SQLException ex){
            throw new DataException(" AdminProvincia -> darAlta(int idPais, int idCiudad, int idProvincia) e = "+ex.getMessage());
        }finally{
            SqlManager.closePreSt(preSt);
        }
    }

}
